package DAO;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import CONEXAO.Conexao;
import CORE.GenericDAO;
import DTO.ListaDTO;
import DTO.ObraDTO;
import DTO.UsuarioDTO;

public class ListaDAO extends GenericDAO<ListaDTO>{

	public ListaDAO() {
		super("lista", ListaDTO.class);
	}		
	
	@Override
	public String gerarSQLRemover() {
		StringBuilder sql = new StringBuilder();                        
		sql.append("DELETE FROM ");
		sql.append(tabela);
		sql.append(" WHERE usuario = (?) AND obra = (?);");
		return sql.toString();
	}
	
	@Override
	public String gerarSQLAlterar() {
		StringBuilder sql = new StringBuilder();                        
		sql.append("UPDATE ");
		sql.append(tabela);
		sql.append(" SET status = (?) ");
		sql.append(" WHERE usuario = (?) AND obra = (?);");
		return sql.toString();
	}
	
	public List<ListaDTO> pesquisarObrasDoUsuario(UsuarioDTO usuario){
		try {
			List<ListaDTO> obras = new ArrayList<>();
            Connection conn = Conexao.conectar(BANCO);
            StringBuilder sql = new StringBuilder();                        
            sql.append("SELECT l.* ");
            sql.append("FROM lista l ");
            sql.append("WHERE l.usuario = (?) ");                        
            
            PreparedStatement ps = conn.prepareStatement(sql.toString());
            ps.setLong(1, usuario.getCodigo());
            
            ResultSet rs = ps.executeQuery();
            while(rs.next()){
            	obras.add(criarObjeto(rs));
            }
                        
            rs.close();                        
            conn.close();
            
            return obras;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
			
	public boolean pesquisarObraEstaListaUsuario(UsuarioDTO usuario, ObraDTO obra){
		try {
			ListaDTO lista = null;
            Connection conn = Conexao.conectar(BANCO);
            StringBuilder sql = new StringBuilder();                        
            sql.append("SELECT l.* ");
            sql.append("FROM lista l ");
            sql.append("WHERE l.usuario = (?) "); 
            sql.append(" AND l.obra = (?)");
            
            PreparedStatement ps = conn.prepareStatement(sql.toString());
            ps.setLong(1, usuario.getCodigo());
            ps.setLong(2, obra.getCodigo());
            
            ResultSet rs = ps.executeQuery();
            if(rs.next()){
            	lista = criarObjeto(rs);
            }
                        
            rs.close();                        
            conn.close();
            
            return lista != null;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}
	
	@Override
	public void setarPSExcluir(PreparedStatement ps, ListaDTO lista) throws SQLException {
		ps.setLong(1, lista.getUsuario().getCodigo());
		ps.setLong(2, lista.getObra().getCodigo());
	}

	@Override
	public void setarPSIncluir(PreparedStatement ps, ListaDTO lista) throws SQLException {
		ps.setLong(1, lista.getUsuario().getCodigo());
		ps.setLong(2, lista.getObra().getCodigo());
		ps.setLong(3, lista.getStatus().getCodigo());
	}
	
	@Override
	public void setarPSAlterar(PreparedStatement ps, ListaDTO lista) throws SQLException {
		ps.setLong(1, lista.getStatus().getCodigo());
		ps.setLong(2, lista.getUsuario().getCodigo());
		ps.setLong(3, lista.getObra().getCodigo());		
	}
	
	@Override
	public ListaDTO criarObjeto(ResultSet rs) throws SQLException {
		ListaDTO lista = new ListaDTO();
		lista.setUsuario(new UsuarioDAO().pesquisarPorCodigo(rs.getLong(1)));
		lista.setObra(new ObraDAO().pesquisarPorCodigo(rs.getLong(2)));
		lista.setStatus(new StatusDAO().pesquisarPorCodigo(rs.getLong(3)));		
		return lista;
	}	
}